package main

import (
	"context"
	"flag"
	"os"

	"gitee.com/EagleMao/eino_n9e_tool/agent/tools"
	"gitee.com/EagleMao/eino_n9e_tool/cmd/cli"
	"gitee.com/EagleMao/eino_n9e_tool/config"
	"gitee.com/EagleMao/eino_n9e_tool/pkg/llm/ark"
	"gitee.com/EagleMao/eino_n9e_tool/pkg/logger"
	"github.com/cloudwego/eino/components/model"
	"github.com/cloudwego/eino/components/tool"
	"github.com/cloudwego/eino/compose"
	"github.com/cloudwego/eino/flow/agent/react"
	"go.uber.org/zap"
)

var (
	configPath = flag.String("config", "", "配置文件路径")
	mode       = flag.String("mode", "cli", "运行模式: httpx, cli")
	version    = "1.0.0"
)

func main() {

	flag.Parse()

	// 初始化日志服务
	logger.Init()
	logger.Info("eino_n9e_tool 日志初始化完成")

	// 加载配置文件
	var err error
	cfg, err := config.Load(*configPath)
	if err != nil {
		logger.Fatal("加载配置文件失败", zap.Error(err))
		os.Exit(1)
	}

	logger.Info("夜莺agent智能体开始启动...",
		zap.String("version", version),
		zap.String("mode", *mode),
		zap.String("nightingale_endpoint", cfg.Nightingale.Endpoint),
	)

	ctx := context.Background()

	// 创建model
	llmModel, err := ark.CreateArkModel(ctx, cfg.LLM)
	if err != nil {
		logger.Fatal("创建ark大语言模型失败", zap.Error(err))
		os.Exit(1)
	}

	// 初始化夜莺服务
	n9eService := tools.NewN9EClient(cfg.Nightingale.Endpoint, cfg.Nightingale.Token)

	// 初始化工具
	currentUserTool := tools.GetQueryCurrentUserTool(n9eService)
	currentEventTool := tools.GetQueryCurrentEventTool(n9eService)
	historyEventTool := tools.GetQueryHistoryEventTool(n9eService)
	metricsTool := tools.GetQueryPromTool(n9eService)
	currentTimeTool := tools.GetCurrentTime()

	n9eTools := []tool.BaseTool{
		currentUserTool,
		currentEventTool,
		historyEventTool,
		metricsTool,
		currentTimeTool,
	}

	switch *mode {
	case "cli":
		// 运行CLI模式
		runCliServer(ctx, cfg, llmModel, n9eTools)
	case "httpx":
		runHttpServer()
	default:
		logger.Fatal("启动模式参数不正确", zap.String("mode", *mode))
		os.Exit(1)
	}

}

func runCliServer(ctx context.Context, cfg *config.Config, model model.ToolCallingChatModel, n9eTools []tool.BaseTool) {

	// MessageModifier 会在每次把所有历史消息传递给 ChatModel 之前执行
	//messageModifier := func(ctx context.Context, input []*schema.Message) []*schema.Message {
	//	for _, msg := range input {
	//		fmt.Println(msg.Content)
	//	}
	//	return input
	//}

	ragent, err := react.NewAgent(ctx, &react.AgentConfig{
		ToolCallingModel: model,
		ToolsConfig: compose.ToolsNodeConfig{
			Tools: n9eTools,
		},
		MessageModifier: nil, // 消息修改器
		MaxStep:         20,
	})

	if err != nil {
		logger.Error("创建react agent失败", zap.Error(err))
		os.Exit(1)
	}

	// 创建CLI
	cmdCli := cli.NewCli(ragent)

	// 运行CLI
	if err := cmdCli.Run(ctx); err != nil {
		logger.Error("CLI运行失败", zap.Error(err))
		os.Exit(1)
	}

	//sr, err := ragent.Stream(ctx, []*schema.Message{
	//	{
	//		Role:    schema.System,
	//		Content: persona,
	//	},
	//	{
	//		Role:    schema.User,
	//		Content: "查询当前告警信息",
	//	},
	//})
	//
	//if err != nil {
	//	logger.Error("react agent 流式对话失败", zap.Error(err))
	//	return
	//}
	//
	//defer sr.Close()
	//logger.Info("react agent 流式对话开始")
	//for {
	//	msg, err := sr.Recv()
	//	if err != nil {
	//		if errors.Is(err, io.EOF) {
	//			// finish
	//			break
	//		}
	//		// error
	//		logger.Info("react agent 流式对话失败", zap.Error(err))
	//		return
	//	}
	//
	//	// 打字机打印
	//	logger.Info("react agent 流式对话", zap.String("role", fmt.Sprintln(msg.Role)), zap.String("content", msg.Content))
	//}

}

func runHttpServer() {

}
